package business;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import utils.HibernateUtil;

import entities.Auteur;
import entities.Boek;
import entities.Genre;

public class BoekZoeker implements IEntityZoeker<Boek>
{
	List<Boek> results;
	private boolean changed = true;
	
	private int id;
	private String titel;
	private String omschrijving;
	private boolean uitleenbaar;
	private Genre genre;
	private String isbn;
	private String auteurNaam;
	private String auteurVoornaam;
	
	// Getters en Setters
	
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		changed = true;
		this.id = id;
	}
	public String getTitel()
	{
		return titel;
	}
	public void setTitel(String titel)
	{
		changed = true;
		this.titel = titel;
	}
	public String getOmschrijving()
	{
		return omschrijving;
	}
	public void setOmschrijving(String omschrijving)
	{
		changed = true;
		this.omschrijving = omschrijving;
	}
	public boolean isUitleenbaar()
	{
		return uitleenbaar;
	}
	public void setUitleenbaar(boolean uitleenbaar)
	{
		changed = true;
		this.uitleenbaar = uitleenbaar;
	}
	public Genre getGenre()
	{
		return genre;
	}
	public void setGenre(Genre genre)
	{
		changed = true;
		this.genre = genre;
	}
	public String getIsbn()
	{
		return isbn;
	}
	public void setIsbn(String isbn)
	{
		changed = true;
		this.isbn = isbn;
	}
	public String getAuteurNaam()
	{
		return auteurNaam;
	}
	public void setAuteurNaam(String auteurNaam)
	{
		changed = true;
		this.auteurNaam = auteurNaam;
	}
	public String getAuteurVoornaam()
	{
		return auteurVoornaam;
	}
	public void setAuteurVoornaam(String auteurVoornaam)
	{
		changed = true;
		this.auteurVoornaam = auteurVoornaam;
	}

	// Methodes

	@Override
	public List<Boek> zoek()
	{
		if(changed)
		{
			Session session = HibernateUtil.getSessionFactory().openSession();
			String queryString = "FROM entities.Boek";
			
			String j = getJoinStatements();
			if(j != null)
			{
				queryString = j;
			}
			
			queryString += getWhereStatements();
			
			Query query = session.createQuery(queryString);
			
			results = query.list();
			
			session.close();
			
			changed = false;
		}
		
		return results;
	}
	
	private String getJoinStatements()
	{
		String jo = null;
		
		if(auteurNaam != null && !auteurNaam.isEmpty() ||
				auteurVoornaam != null && !auteurVoornaam.isEmpty())
		{
			jo = "SELECT b FROM entities.Auteur a JOIN a.boeken b ";
		}
		
		return jo;
	}
	
	private String getWhereStatements()
	{
		String wh = "";
		
		if(titel != null && !titel.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " titel = \'" + titel + "\'";
		}
		if(omschrijving != null && !omschrijving.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " omschrijving = \'" + omschrijving + "\'";
		}
		if(genre != null && genre.getNaam() != null && !genre.getNaam().isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " genre_id IN (SELECT id FROM entities.Genre WHERE naam = \'" + genre.getNaam() + "\')";
		}
		if(isbn != null && !isbn.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			wh += " titel = \'" + titel + "\'";
		}
		if(auteurNaam != null && !auteurNaam.isEmpty() ||
				auteurVoornaam != null && !auteurVoornaam.isEmpty())
		{
			if(!wh.isEmpty())
			{
				wh += " AND";
			}
			
			if(auteurNaam != null && !auteurNaam.isEmpty())
			{
				wh += " naam = \'" + auteurNaam + "\'";
			}
			if(auteurVoornaam != null && !auteurVoornaam.isEmpty())
			{
				if(auteurNaam != null && !auteurNaam.isEmpty())
				{
					wh += " AND ";
				}
				
				wh += " voornaam = \'" + auteurVoornaam + "\'";
			}
			
			wh += "))";
		}
		
		if(!wh.isEmpty())
		{
			wh = " WHERE" + wh;
		}
		
		return wh;
	}
}
